var { curry } = require("lodash");

var l = console.log;
// 练习 1
//==============（局部调用英文是partial apply）
// 只需传给函数一些参数，就能得到一个新函数
// 只传给函数一部分参数通常也叫做局部调用（partial application）
// 通过局部调用移除所有参数

var words = function (str) {
  return split(" ", str);
};

var split = curry(function (separator, str) {
  return str.split(separator);
});

var splitByWhitespace = split(" ");

l(splitByWhitespace("hello world"));

// 练习 1a
//==============
// 使用 `map` 创建一个新的 `words` 函数，使之能够操作字符串数组

var sentences = undefined;

var map = curry(function (f, arr) {
  return arr.map(f);
});

var wordsArr = map(splitByWhitespace);

l(wordsArr(["hello world", "spaceless", "hi you"]));

// 练习 2
//==============
// 通过局部调用（partial apply）移除所有参数

var filterQs = function (xs) {
  return filter(function (x) {
    return match(/q/i, x);
  }, xs);
};

var filter = curry((fn, arr) => arr.filter(fn));
var match = curry((what, str) => str.match(what));

var matchQ = match(/q/i);
var filterByMatchQ = filter(matchQ);

l(filterByMatchQ(["qweqwe", "helloworld", "QQai"]));

// 练习 3
//==============
// 使用帮助函数 `_keepHighest` 重构 `max` 使之成为 curry 函数

// 无须改动:
var _keepHighest = function (x, y) {
  return x >= y ? x : y;
};

// 重构这段代码:
// var max = function (xs) {
//   return reduce(
//     function (acc, x) {
//       return _keepHighest(acc, x);
//     },
//     -Infinity,
//     xs
//   );
// };

var reduce = curry((fn, init, arr) => arr.reduce(fn, init));

var max = reduce(_keepHighest, -Infinity);

l(max([1, 2, 3, 4, 56, 6, 7, 8, 9, 100]));

// 彩蛋 1:
// ============
// 包裹数组的 `slice` 函数使之成为 curry 函数
// //[1,2,3].slice(0, 2)
// var slice = undefined;

var slice = curry((begin, end, arr) => arr.slice(begin, end));

l(slice(0)(2)([1, 2, 3]));


// 彩蛋 2:
// ============
// 借助 `slice` 定义一个 `take` curry 函数，该函数调用后可以取出字符串的前 n 个字符。
var take = undefined;

var take = slice(0)